//自己
#include <iostream>
#include <vector>
using namespace std;

int main() {
    //1.读数据
    int n=0, m=0, q=0;
    cin >> n >> m >> q;

    vector<vector<int>> vv1(n+1, vector<int>(m+1));//有缺省, 会自动初始化
    for (int i=1; i<=n; i++)//一行一行的读取
    {
        //vv1[i].resize(m+1);//错误原因: 没给第一行开辟空间//提前开空间, 缺省值会自动用0初始化
        for (int j=1; j<=m; j++)
        {
            cin >> vv1[i][j];
        }
    }


    //2.预处理, 创建二维前缀和数组, (vv1[1][1], vv1[i][j])
    vector<vector<long long>> dp(n+1, vector<long long>(m+1));
    for (int i=1; i<=n; i++)
    {   
        //dp[i].resize(m+1);//错误原因: 没给第一行开辟空间
        for (int j=1; j<=m; j++)
        {
            dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + vv1[i][j];//这一步有问题吗? 为什么只循环一次
        }
    }

    //3.通过二维前缀和数组计算
    int x1=0, y1=0, x2=0, y2=0;
    while (q--)//一行一行的读取
    {
        cin >> x1 >> y1 >> x2 >> y2;
        cout << dp[x2][y2] - dp[x2][y1-1] - dp[x1-1][y2] + dp[x1-1][y1-1] << endl;//注意
    }

    return 0;
}

//答案
#include <iostream>
#include <vector>
using namespace std;

int main() {
    //1.读数据
    int n=0, m=0, q=0;
    cin >> n >> m >> q;

    vector<vector<int>> vv1(n+1, vector<int>(m+1));//有缺省, 会自动初始化
    for (int i=1; i<=n; i++)//一行一行的读取
        //vv1[i].resize(m+1);//错误原因: 没给第一行开辟空间//提前开空间, 缺省值会自动用0初始化
        for (int j=1; j<=m; j++)
            cin >> vv1[i][j];


    //2.预处理, 创建二维前缀和数组, (vv1[1][1], vv1[i][j])
    vector<vector<long long>> dp(n+1, vector<long long>(m+1));
    for (int i=1; i<=n; i++)
        //dp[i].resize(m+1);//错误原因: 没给第一行开辟空间
        for (int j=1; j<=m; j++)
            dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + vv1[i][j];//这一步有问题吗? 为什么只循环一次

    //3.通过二维前缀和数组计算
    int x1=0, y1=0, x2=0, y2=0;
    while (q--)//一行一行的读取
    {
        cin >> x1 >> y1 >> x2 >> y2;
        cout << dp[x2][y2] - dp[x2][y1-1] - dp[x1-1][y2] + dp[x1-1][y1-1] << endl;//注意
    }

    return 0;
}
// 64 位输出请用 printf("%lld")
//时间:  O(2*n*m)
//空间:  O(2*n*m)